在上一篇我們大致上介紹了 Node.js 的第三方 library 的安全實踐後,我再為大家介紹其他的安全實踐吧~
在這種攻擊中,由於應用程式處理傳入 HTTP 請求的方式,應用程式無法達到其設計目的,例如: 執行應用程式。
能夠導致拒絕服務的原因:
配置錯誤或有缺乏錯誤處理的 Client 端也可以向伺服器發送請求模式,從而導致拒絕服務,不一定要惡意攻擊者為之。
以下是 Node.js "非"安全實踐的範例:
const net = require('net');
const server = net.createServer(function (socket) {
// socket.on('error', console.error) // this prevents the server to crash
socket.write('Echo server\r\n');
socket.pipe(socket);
});
server.listen(5000, '0.0.0.0');
解說:
上述範例因為缺乏針對 error 的錯誤處理,而導致如果有不好的 request ,可能伺服器就會直接 crash
如何緩解? 針對這方面需要怎麼處理?
使用反向代理接收請求並將請求轉發到 Node.js 應用程式。
反向代理可以提供快取、負載平衡、IP 黑名單等功能,從而降低 DoS 攻擊有效的可能性。
說明:
此處的反向代理可以使用 nginx,但此處就先部戲講,有興趣可以參考: https://blog.logrocket.com/how-to-run-a-node-js-server-with-nginx/
正確配置伺服器逾時,以便可以丟棄空閒或請求到達速度太慢的連線。
(詳細文件可以參考: https://nodejs.org/api/http.html)
在 Node.js 中,超時處理可以使用 headersTimeout、requestTimeout、timeout 和 keepAliveTimeout。
限制每台主機開啟的套接字數量和總數。
(詳細文件可以參考: https://nodejs.org/api/http.html)
在 Node.js 中,可以使用 agent.maxSockets、agent.maxTotalSockets、agent.maxFreeSockets 和 server.maxRequestsPerSocket 等來進行設定。
這是涉及兩個 HTTP 伺服器(通常是代理和 Node.js 應用程式)的攻擊。
過程範例:
如何緩解?
insecureHTTPParser
選項。要注意不要公開洩漏或是洩漏敏感資訊給某個平台上的未經授權使用者~
以在套件發布期間為例,目前目錄中包含的所有檔案和資料夾都會推送到 npm 註冊表,所以需要注意自己需要在推送之前不要誤推送不應該推送的敏感資訊給別人知道。
如何緩解?
npm publish --dry-run
列出所有要發佈的文件。確保在發布包之前檢查內容。.gitignore
和 .npmignore
)也很重要。在這些文件中,可以指定不應發布哪些文件/資料夾。 package.json
中的 files 屬性允許逆操作-允許清單。以上大致上介紹這幾點安全實踐 ~ 雖然說還有滿多是在 Node.js 官方公布的安全實踐而在今天的文章中沒提到的,但有介紹幾個滿常見可能會在還不熟悉 Node.js 開發可能會遇到的問題 ~